home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 2004 #2 / Amiga Plus CD - 2004 - No. 02.iso / AmigaPlus / Tools / Development / AmigaTalk / general / DependencyTransformer.st < prev    next >
Encoding:
Text File  |  2004-01-31  |  2.5 KB  |  75 lines

  1. " ----------------------------------------------------------------
  2.   DependencyTransformer transforms update messages from an object 
  3.   into concrete messages to a receiver.
  4.   
  5.   Objects understand:   
  6.    expressInterestIn: anAspect for: anObject sendBack: aSelector  
  7.  
  8.   by creating a DependencyTransformer that looks for upates on anAspect 
  9.   and sending aSelector to anObject 
  10.   
  11.   retractInterestIn: anAspect for: anObject 
  12.     removes the DependencyTransformer created above.
  13.  
  14.   ValueModels understand      
  15.     onChangeSend: aSelector to: anObject retractInterestsFor: anObject   
  16.     
  17.     since ValueModels only do changed: #value 
  18.     the aspect can be dropped.
  19.     
  20.     Instance Variables:   
  21.       receiver     <Object>  the object to receive a message on update   
  22.       selector     <Object>  the message selector to send   
  23.       numArguments <Object>  number of arguments in the message selector
  24.       aspect       <Object>  the change aspect to look for 
  25.   ----------------------------------------------------------------
  26. "
  27. Class DependencyTransformer :Object ! receiver selector numArguments aspect !
  28. [
  29.    setReceiver: aReceiver aspect: anAspect selector: aSymbol      
  30.      receiver     <- aReceiver.   
  31.      aspect       <- anAspect.   
  32.      selector     <- aSymbol.   
  33.      numArguments <- selector numArgs.   
  34.      
  35.      numArguments > 2 
  36.         ifTrue: [self error: 'selector expects too many arguments' ] 
  37. |  
  38.    aspect   
  39.      ^ aspect
  40. |
  41.    receiver   
  42.      ^ receiver 
  43. |
  44.    selector   
  45.      ^ selector 
  46. |  
  47.    matches: anObject forAspect: anAspect   
  48.      ^ receiver == anObject and: [aspect == anAspect] 
  49. |  
  50.    update: anAspect with: parameters from: anObject
  51.      (aspect == anAspect) 
  52.        ifFalse: [ ^ self].   
  53.        
  54.      (numArguments == 0) 
  55.        ifTrue: [ ^ receiver perform: selector].   
  56.        
  57.      (numArguments == 1) 
  58.        ifTrue: [ ^ receiver perform: selector with: parameters].   
  59.        
  60.      (numArguments == 2)
  61.        ifTrue: [ ^ receiver perform: selector with: parameters with: anObject] 
  62. |  
  63.    = anObject 
  64.      " Two DependencyTransformers are equivalent if their receiver
  65.      * aspect and selectors are identical.
  66.      "   
  67.      ^ self class == anObject class and: [receiver == anObject receiver 
  68.                                     and: [aspect   == anObject aspect   
  69.                                     and: [selector == anObject selector] ] ] 
  70. |
  71.    hash   
  72.      " Redefined because #= is redefined."   
  73.      ^ (receiver identityHash bitXor: aspect identityHash) bitXor: selector identityHash 
  74. ]
  75.